package ca.clarity.hms.activity;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.*;

import java.text.DecimalFormat;

/**
 * 환자 목록을 출력하는 activity class 이다.
 *
 * @author Junghun, Shin
 * @version 1.0
 */
public class HmsPatientListActivity extends Activity {

    public static String TAG = HmsPatientListActivity.class.getSimpleName();

    // 현재 위치를 가져온다.
    private static final int THREAD_LOCATION = 101;

    // 네트워크 연결상태를 가져 온다.
    private static final int THREAD_IS_ONLINE = 102;

    // 사용가능한 메모리 사용량을 가져 온다.
    private static final int THREAD_AVAILABLE_MEMORY = 103;

    // 위도.
    TextView latitudeTextView;

    // 경도.
    TextView longitudeTextView;

    // 네트워크 연결 상태.
    TextView networkTextView;

    // 메모리 사용량.
    TextView memoryTextView;

    // 환자 추가 버튼.
    Button patientListAddPatientButton;

    // 뒤로 가기 버튼.
    Button patientListBackButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 커스텀 타이틀 바를 설정 한다.
        Window window = getWindow();
        window.requestFeature(Window.FEATURE_CUSTOM_TITLE);

        setContentView(R.layout.activity_hms_patient_list);

        window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_patient_list);


        /**
         * 환자 목록
         */
        ArrayAdapter<String> patients = new ArrayAdapter<String>(this, R.layout.simple_list_item_3);

        // 아이템을 추가
        patients.add("Hello");
        patients.add("World");
        patients.add("Clarity");

        // ListView 가져오기
        ListView patientListView = (ListView) findViewById(R.id.patientListView);

        // ListView에 각각의 아이템표시를 제어하는 Adapter를 설정
        patientListView.setAdapter(patients);

        // 아이템을 [클릭]시의 이벤트 리스너를 등록
        patientListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ListView listView = (ListView) parent;

                Log.i(TAG, "아이템을 [클릭]시의 이벤트 리스너를 등록");


                // 환자 상세페이지로 이동
                Intent intent = new Intent(HmsPatientListActivity.this, HmsPatientDetailActivity.class);
                startActivity(intent);

            }
        });


        /**
         * Footer
         */

        // 위도.
        latitudeTextView = (TextView) findViewById(R.id.latitudeTextView);

        // 경도.
        longitudeTextView = (TextView) findViewById(R.id.longitudeTextView);

        // 네트워크 연결상태.
        networkTextView = (TextView) findViewById(R.id.networkTextView);

        // 메모리 사용량.
        memoryTextView = (TextView) findViewById(R.id.memoryTextView);

        // 환자 등록 버튼.
        patientListAddPatientButton = (Button) findViewById(R.id.patientListAddPatientButton);
        patientListAddPatientButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(HmsPatientListActivity.this, HmsPatientRegistrationActivity.class);
                startActivity(i);
                finish();
            }
        });

        // 뒤로 가기 버튼.
        patientListBackButton = (Button) findViewById(R.id.patientListBackButton);
        patientListBackButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        // 현재 위치를 가져 온다.
        mHandler.sendMessage(mHandler.obtainMessage(THREAD_LOCATION));

        // 네트워크 연결상태를 가져 온다.
        mHandler.sendMessage(mHandler.obtainMessage(THREAD_IS_ONLINE));

        // 사용가능한 메모리 양을 가져 온다.
        mHandler.sendMessage(mHandler.obtainMessage(THREAD_AVAILABLE_MEMORY));


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        //getMenuInflater().inflate(R.menu.hms_village, menu);
        return true;
    }

    /**
     * Handler 를 정의한다.
     * 모든 Thread 를 등록해 놓고 필요할때 호출한다.
     */
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case THREAD_LOCATION:
                    getLocationInformation();
                    break;
                case THREAD_IS_ONLINE:
                    isOnline();
                    break;
                case THREAD_AVAILABLE_MEMORY:
                    getCurrentMemory();
                    break;
            }
        }
    };

    /**
     * 현재 위치의 위도, 경도를 구한다.
     */
    public void getLocationInformation() {

        // 위도, 경도는 소숫점 두자리까지 구한다. 소숫점 셋째자리 이하는 반올림으로 처리 한다.
        String pattern = ".##";

        DecimalFormat decimalFormat = new DecimalFormat(pattern);

        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        // 화면에 출력 한다.
        latitudeTextView.setText(decimalFormat.format(location.getLatitude()) + "");
        longitudeTextView.setText(decimalFormat.format(location.getLongitude()) + "");
    }

    /**
     * 네트워크 연결상태를 확인 한다.
     *
     * @return
     */
    private void isOnline() {

        String result;

        try {
            ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo.State wifi = conMan.getNetworkInfo(1).getState(); // wifi

            NetworkInfo.State mobile = conMan.getNetworkInfo(0).getState(); // mobile ConnectivityManager.TYPE_MOBILE

            if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) {
                result = "Connected";
            } else if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) {
                result = "Connected";
            } else {
                result = "Not Connected";
            }

        } catch (NullPointerException e) {
            result = "Not Connected";
        }

        // 화면에 출력 한다.
        networkTextView.setText(result);
    }

    /**
     * 사용가능한 메모리를 가져 온다.
     */
    private void getCurrentMemory() {
        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        activityManager.getMemoryInfo(mi);
        long availableMegs = mi.availMem / 1048576L;

        // 화면에 출력 한다.
        memoryTextView.setText(availableMegs + " M");
    }
}
